﻿// -------------------------------------------------------------------------------------------------------
// LICENSE INFORMATION
//
// - This software is licensed under the MIT shared source license.
// - The "official" source code for this project is maintained at http://mtcagent.codeplex.com
//
// Copyright (c) 2010 OpenNETCF Consulting
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 
// associated documentation files (the "Software"), to deal in the Software without restriction, 
// including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
// and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial 
// portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
// -------------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.IO;
using System.Reflection;
using OpenNETCF.IoC;
using System.Diagnostics;
using System.Xml.Linq;
using System.Threading;
using System.Security.Policy;
using System.Net;

namespace OpenNETCF.MTConnect
{
    internal class LogService : ILogService
    {
        public event EventHandler<GenericEventArgs<LogErrorEntry>> Error;
        public event EventHandler<GenericEventArgs<LogEntry>> Warning;
        public event EventHandler<GenericEventArgs<LogEntry>> Info;

        public bool UseTimeStamps { get; set; }

        public LogService()
        {
            UseTimeStamps = true;
        }

        public void Log(LogPriority priority, string text, string source)
        {
            switch (priority)
            {
                case LogPriority.Error:
                    var error = new LogErrorEntry()
                    {
                        Priority = priority,
                        Source = source,
                        Text = text,
                        TimeStamp = DateTime.Now
                    };
                    Error.Fire(this, new GenericEventArgs<LogErrorEntry>(error));
                    break;
                case LogPriority.Warning:
                    var warning = new LogEntry()
                    {
                        Priority = priority,
                        Source = source,
                        Text = text,
                        TimeStamp = DateTime.Now
                    };
                    Warning.Fire(this, new GenericEventArgs<LogEntry>(warning));
                    break;
                default:
                    var info = new LogEntry()
                    {
                        Priority = priority,
                        Source = source,
                        Text = text,
                        TimeStamp = DateTime.Now
                    };
                    Info.Fire(this, new GenericEventArgs<LogEntry>(info));
                    break;
            }

            // TODO: add writing to a log file, etc.
        }

        public void Log(Exception exception, string source)
        {
            var error = new LogErrorEntry()
            {
                Priority = LogPriority.Error,
                Source = source,
                Text = exception.Message,
                TimeStamp = DateTime.Now,
                Exception = exception
            };
            Error.Fire(this, new GenericEventArgs<LogErrorEntry>(error));

            // TODO: add writing to a log file, etc.
        }
    }
}
